<?php
defined('_IN_CMS') or die('Fuck off');

class Mail extends Db
{
    use data, face, rights;
    
    public $data; // Данные класса
    public $dialog_data;
    public $nm_count; // Кол-во непрочитанных писем
    private $errors; // Массив с сообщениями об ошибках
    
    public function __construct()
    {
        $data['id'] = 0; // Номер сообщения в таблице
        $data['date'] = '2012-07-10 20:58:48'; // Дата отправки сообщения
        $data['author'] = 0; // id автора
        $data['to'] = 0; // id получателя. Предполагается несколько, т.е. "1,2,3,56"
        $data['text'] = ''; // Текст сообщения
        $data['attach'] = ''; // Прикреплённый файл. К примеру, fh8s3dKOQ7h8
        $data['hidden'] = false; // Скрытое ли сообщение. Предполагается, что сообщения удаляться из базы не будут.
        $data['new'] = false; // Новое ли сообщение
    }
    
    public function sendMessage(&$user)
    {
        // Отправка сообщения
        // mysql_insert_id - нужно использовать где-то
        $this->data['text'] = $_POST['text']; // Текст сообщения
        $this->data['to_login'] = $_POST['login'];
        $this->data['from'] = (int)$user->id; // Номер отправителя
        $this->data['to'] = (int)$_POST['to']; // Номер получателя

        var_dump($this->data);

        // Проверка на ошибки
        if (($this->data['from'] == 0) || ($this->data['to'] == 0)) {
            $this->errors[] = 'Делим на ноль?';
        }
        if ((!self::can($user, 21)) || (!self::can($user, 1))) {
            // Если SVI
            // Или может отправлять сообщения
            $this->errors[] = 'Тварь я дрожащая или право имею?';
        }
        if ($user->authorized == false) {
            $this->errors[] = 'Авторизуйся хоть';
        }
        if ($this->data['from'] == $this->data['to']) {
            // Если сообщение отсылается самому себе
            $this->errors[] = 'Тебе так одиноко, что ты пишешь самому себе?';
        } 
        if (!empty($this->errors[0])) {
            $this->printError($this->errors);
            echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/mail">';
        } else {
            // Узнаём номер будущего сообщения
            $last_message = self::db_query("Show TABLE STATUS LIKE 'mail00'");
            $last_message = mysql_result($last_message, 0, "Auto_increment");

            // Добавляем непрочитанное к тому, кому послали сообщение
            // self::db_query("UPDATE `users00` SET `nm_count` = `nm_count` + 1 WHERE `id` = ".$data['to']." LIMIT 1 --");

            // Ищем диалог между этими пользователями
            $dialogs = self::db_query("SELECT * FROM `dialogs00` 
            WHERE 
            (((`u1` = '".$this->data['from']."') AND (`u2` = '".$this->data['to']."')) 
            OR 
            ((`u1` = '".$this->data['to']."') AND (`u2` = '".$this->data['from']."'))) 
            LIMIT 1 --");

            if (mysql_num_rows($dialogs) > 0) {
                // Если диалог есть, то обновляем данные
                $dialog_id = mysql_result($dialogs, 0, "id"); // Номер диалога
                // $dialog_id = (int)$dialog_id - 1; // Зачем это нужно?!
                self::db_query("UPDATE `dialogs00` SET `u1` = '".$this->data['from']."', `u2` = '".$this->data['to']."', 
                            `last_from` = '".$this->data['from']."', `last_message` = '".$last_message."' 
                            WHERE `id` = '".$dialog_id."' LIMIT 1 --;");
                self::db_query("INSERT INTO `mail00` (`id`, `date`, `author`, `to`, `dialog`, `text`, `attach`, `new`) VALUES 
                                (NULL, CURRENT_TIMESTAMP, '".$this->data['from']."', '".$this->data['to']."', '".$dialog_id."', '".$this->data['text']."', '', '1') --");
            } else {
                // Создаём диалог
                self::db_query("INSERT INTO `dialogs00` (`id`, `u1`, `u2`, `last_from`, `last_message`) 
                             VALUES (NULL, '".$this->data['from']."', '".$this->data['to']."', '".$this->data['from']."', '".$last_message."');");
                $last_dialog = self::db_query("Show TABLE STATUS LIKE 'dialogs00'"); // Номер будущего сообщения
                $last_dialog = mysql_result($last_dialog, 0, "Auto_increment");
                $last_dialog = (int)$last_dialog - 1;
                self::db_query("INSERT INTO `mail00` (`id`, `author`, `to`, `dialog`, `text`, `attach`, `new`) VALUES 
                                (NULL, '".$this->data['from']."', '".$this->data['to']."', '".$last_dialog."', '".$this->data['text']."', '', '1') --");
            }
    
            echo 'Сообщение отправлено. <a href="/mail/'.$this->data['to_login'].'">Вернуться назад</a>';
            if (isset($_POST['dialog'])) {
                echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/mail">';
            } else {
                echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/mail/'.$this->data['to_login'].'">';
            }
        }
    }

    public function checkMail(&$user)
    {
        $mail = self::db_query("SELECT * FROM `mail00` WHERE `to` = '".$user->id."' AND `new` = 1 LIMIT 1 --");
        $this->nm_count = (int)mysql_num_rows($mail);
    }
    
    public function showDialogs(&$user)
    {
        // if (self::can($user, 1)) || ($user->authorized == true) {
        // Выбираем диалоги, где ты один из собеседников
        $dialogs = self::db_query("SELECT * FROM `dialogs00` 
        WHERE ((`u1` = '".$user->id."') OR (`u2` = '".$user->id."'))");
        // Если есть такие диалоги
        if (mysql_num_rows($dialogs) > 0) {
            for ($i = 0; $i < mysql_num_rows($dialogs); $i++) {
                $this->dialog_data['dialog_id'] = mysql_result($dialogs, $i, "id"); // Номер диалога
                $this->dialog_data['u1'] = mysql_result($dialogs, $i, "u1"); // Номер первого собеседника
                $this->dialog_data['u2'] = mysql_result($dialogs, $i, "u2"); // Номер второго собеседника
                $this->dialog_data['lf'] = mysql_result($dialogs, $i, "last_from"); // Номер последнего собеседника
                $this->dialog_data['lm'] = mysql_result($dialogs, $i, "last_message"); // Номер последнего сообщения
                $this->dialog_data['sobesednik'] = $this->dialog_data['u1'];
                $me = $this->dialog_data['u2'];

                if ($this->dialog_data['u1'] == $user->id) {
                    $this->dialog_data['sobesednik'] = $this->dialog_data['u2'];
                    $this->dialog_data['me'] = $user->id; // $this->dialog_data['u1']
                }

                // Показывается в диалогах как последнее сообщение
                $lm_sql = self::db_query("SELECT `id`, `text` FROM `mail00` 
                    WHERE `id` = '".$this->dialog_data['lm']."' ORDER BY `id` DESC");
                if (mysql_num_rows($lm_sql) > 0) {
                    // Если есть сообщение в диалоге
                    $this->dialog_data['lm_text'] = mysql_result($lm_sql, 0, "text"); // Текст последнего сообщения
                }
                $s_sql = self::db_query("SELECT `id`, `login` FROM `users00` 
                    WHERE `id` = '".$this->dialog_data['sobesednik']."'"); // Логин собеседника
                $this->dialog_data['s_text'] = mysql_result($s_sql, 0, "login");
                if (!isset($this->dialog_data['lm_text'])) {
                    $this->dialog_data['lm_text'] = '<b>Диалог пуст</b>';
                    // Нада бы и удалить этот диалог
                }
                $this->showDialogsFace($this->dialog_data);
            }
        } else {
            echo 'Никто пока ничего не писал';
        }
    }
    
    public function showDialog(&$user)
    { 
        // Показать диалог с конкретным пользователем
        // Узнать id пользователя по его логину из GET
        $interlocutor_login = $_GET['with']; // логин собеседника
        // Находим id собеседника по его логину
        $interlocutor_sql = self::db_query("SELECT `id`, `login` FROM `users00` WHERE 
                                        `login` = '".$interlocutor_login."' LIMIT 1 --");
        if (mysql_num_rows($interlocutor_sql) == 1) {
            // Если есть такой собеседник
            $interlocutor_id = mysql_result($interlocutor_sql, 0, "id");
        } else {
            die('Не найден собеседник');
        }

        $messages = self::db_query("SELECT `users00`.`id` AS 'user_id', `users00`.`login` AS 'login', `users00`.`nm_count`,
            `dialogs00`.`id` AS 'dialog_id', `dialogs00`.`u1` , `dialogs00`.`u2`, 
            `mail00`.`id` AS 'msg_id',`mail00`.`date` AS 'msg_date', `mail00`.`new`,
            `mail00`.`author` AS 'msg_author', `mail00`.`to` AS 'to', 
            `mail00`.`dialog` AS 'dlg_id', `mail00`.`text` 

            FROM `users00` , `dialogs00` , `mail00` 

            WHERE
            `mail00`.`dialog` = `dialogs00`.`id` AND 
            (
             (`mail00`.`author` = '".$user->id."' AND `mail00`.`to` = '$interlocutor_id') OR
             (`mail00`.`author` = '$interlocutor_id' AND `mail00`.`to` = '".$user->id."')
            ) AND
            (`users00`.`id` = `dialogs00`.`u1` OR `users00`.`id` = `dialogs00`.`u2`) AND
            `users00`.`id` = `mail00`.`author`
            ORDER BY `msg_id` DESC");
        if (mysql_num_rows($messages) > 0) {
            // Если есть сообщения с этим пользователем
            // Узнать диалог сообщений
            $dialog_id = mysql_result($messages, 0, "dialog_id");
            // Подсчитать кол-во новых сообщений
            $nm_count = 0; // кол-во новых сообщений
            for ($i = 0; $i < mysql_num_rows($messages); $i++) {
                if (mysql_result($messages, $i, "new") == "1") {
                    $nm_count++; // это число потом вычтем из кол-ва новых сообщений у пользователя ("nm_count")
                }
            }
            // Убавляем кол-во непрочитанных сообщений
            self::db_query("UPDATE `users00` SET `nm_count` = `nm_count` - '$nm_count' WHERE `users00`.`id` = '".$user->id."' LIMIT 1 --"); 
            
            // Сделать прочитанными сообщения из диалога
            // Верно
            self::db_query("UPDATE `mail00` SET `new` = '0' WHERE `dialog` = '$dialog_id' AND `to` = '".$user->id."' --"); 

            for ($i = 0; $i < mysql_num_rows($messages); $i++) {
                $id = (int)mysql_result($messages, $i, "msg_id");
                $this->data['date'] = date('H:i:s d.m.Y', strtotime(mysql_result($messages, $i, "msg_date")));
                $this->data['author'] = (int)mysql_result($messages, $i, "msg_author");
                $this->data['to'] = (int)mysql_result($messages, $i, "to");
                $this->data['text'] = mysql_result($messages, $i, "text");
                $this->data['login'] = mysql_result($messages, $i, "login");
                $this->data['new'] = (int)mysql_result($messages, $i, "new");
                // Идущие подряд сообщения от одного пользователя оформить как одно сообщение
                /*if (($i != 0) && ($this->data['prev'] == $this->data['author'])) {
                    $this->data['merge'] = 1;
                    echo $this->data['prev'].':'.$this->data['author'];
                } elseif ($i == 0) {
                    $this->data['prev'] = $this->data['author'];
                    $this->data['merge'] = 0;
                }*/
                $this->showDialogFace($this->data);
            }
        }
        echo '
            <form action="/mail/'.$interlocutor_login.'" method="POST">
                <input type="hidden" name="to" value="'.$interlocutor_id.'">
                <input type="hidden" name="login" value="'.$interlocutor_login.'">
                <div class="gb_panel_addmsg">
                    <div class="auth_col2">';
        include('inc/php/html/tags_bb.php');
        echo '
                    </div>
                    <div class="auth_col2">
                        <textarea class="gb_input_text" name="text" id="articlei" cols="13" placeholder="Текст сообщения" required></textarea>';
        // Скрипт для динамического изменения высоты textarea
        require('inc/php/js/resize_textarea.js'); 
        echo '
                    </div>
                    <div>
                        <input type="submit" class="button_login gb_button_add" name="send" value="Отправить">
                    </div>
                </div>
            </form>
            ';
        }

    public function deleteMessage()
    {
        // UPDATE `mail00` SET `hidden` = '1' WHERE `mail00`.`id` =1 LIMIT 1 --
    }
}

?>
